package com.yanqu.road.entity.common;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class CommonConfirm {
    protected static Logger logger = LogManager.getLogger(CommonConfirm.class.getName());

    public CommonConfirm() {
    }

    public void exec() {
        try {
            // 初始化
            onInit();

            // 检查
            if (check()) {
                // 检查成功回调
                onCheck(true);

                // 前置操作
                if (tryOperate()) {
                    // 前置操作成功回调
                    onTryOperate(true);

                    // 确认操作，在这里发奖
                    if (confirm()) {
                        // 成功回调
                        onSucceed();
                    } else {
                        // 失败回调
                        onFailed();
                    }
                } else {
                    // 前置操作失败回调
                    onTryOperate(false);

                    // 取消操作，回滚一些数据
                    cancel();
                }
            } else {
                // 检查成功回调
                onCheck(false);
            }
        } catch (Exception e) {
            // 错误处理
            onError(e);
        }
    }

    /*
     * check 检查操作（如判断是否满足领奖条件，是否已领奖等）
     */
    public boolean check() {
        return false;
    }

    /*
     * tryOperate 优先操作（如领奖标记设置，优先扣除元宝、代币、道具，玩家数据更改等）
     */
    public boolean tryOperate(){
        return false;
    }

    /*
     * confirm 确认操作（如发奖，增加某项数值，前置操作的后续影响）
     */
    public boolean confirm() {
        return false;
    }

    /*
     * cancel 回滚操作（可预见的回滚操作，如预扣除返还等）
     */
    public void cancel() {
    }

    /*
     * onInit 生命周期 - 初始化
     */
    public void onInit() {

    }

    /*
     * onCheck 生命周期 - 检查
     */
    public void onCheck(boolean succeed) {

    }

    /*
     * onTryOperate 生命周期 - try 操作成功或失败处理
     */
    public void onTryOperate(boolean succeed) {

    }

    /*
     * onSucceed 生命周期 - 成功
     */
    public void onSucceed() {

    }

    /*
     * onFailed 生命周期 - 失败
     */
    public void onFailed() {

    }

    /*
     * onError 生命周期 - 错误处理（打印一些日志等）
     */
    public void onError(Exception e) {
        logger.error("common confirm error", e);
    }
}
